5.8 通过块动作定义默认模板

Go 1.6引入了一个新的块动作(block action),这个动作允许用户定义一个模板并且立即使用。块动作看上去是下面这个样子的:

{{ block arg }}
 Dot is set to arg
{{ end }}

为了更好地了解块动作的使用方法,我们将使用块动作重新实现上一节展示过的例子,并在处理器没有指定特定的模板时,默认展示蓝色的Hello World模板。代码清单5-29展示了修改之后的处理器,正如加粗的代码行所示,处理器的 else 块将不再同时分析 layout.html 文件和 blue_hello.html 文件,而是只分析 layout.html 文件。

代码清单5-29 只对 layout.html 进行语法分析

func process(w http.ResponseWriter, r *http.Request) {
  rand.Seed(time.Now().Unix())
  var t *template.Template
  if rand.Intn(10) > 5 {
    t, _ = template.ParseFiles("layout.html", "red_hello.html")
  } else {
    t, _ = template.ParseFiles("layout.html")
  }
  t.ExecuteTemplate(w, "layout", "")
}

如果我们现在就重新编译并启动服务器,那么服务器就会因为在 else 块中找不到需要进行语法分析的 content 模板而出现随机崩溃的情况。为了解决这个问题,我们需要像代码清单5-30所示的那样,在 layout.html 模板文件中通过块动作定义 content 模板,并将其用作默认的 content 模板。

代码清单5-30 通过块动作添加默认的 content 模板

{{ define "layout" }}
< html>
 < head>
  < meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  < title>Go Web Programming< /title>
 < /head>
 < body>
  {{ block "content" . }}
   < h1 style="color: blue;">Hello World!< /h1>
  {{ end }}
 < /body>
< /html>
{{ end }}

块动作能够高效地定义一个 content 模板,并将它放置到 layout 模板里面。当 layout 模板被执行时,如果模板引擎没有找到可用的 content 模板,那么它就会使用块动作中定义的 content 模板。

在最近的这几章,我们学习了如何接收请求,如何处理请求,以及如何生成用于响应请求的内容,而在接下来的一章,我们将要学习如何通过Go语言将数据存储到内存、文件或者数据库里面。

results matching ""

    No results matching ""